const { PERMISSION_IS_NOT_ALLOWED } = require("../config/error-constants");
const permissionService = require("../service/permission.service");
const { to } = require("../utils");

// 验证登录用户是否有操作moment表权限
// 只有自己的评论可以改，不能改别人的评论
// id => momentId => userId
const verifyMomentPermission = async (ctx, next) => {
    // 1.取出动态表momentId和此时登录账号用户id
    const { momentId } = ctx.params;
    const { id } = ctx.user;
    // 2.查询数据库中是否有momentId和id在同一条记录的数据
    const [error, resp] = await to(permissionService.checkMoment(momentId, id));
    if (error) {
        return ctx.app.emit("error", UNKNOWN_ERROR, ctx);
    }
    if (!resp) {
        return ctx.app.emit("error", PERMISSION_IS_NOT_ALLOWED, ctx);
    }

    // 3.执行下一个中间件
    await next();
};

// 验证登录用户是否有操作某表的权限
// 使用需严格命名
// 某表id=>命名为tableId
const verifyPermission = async (ctx, next) => {
    const { id } = ctx.user;
    const keyName = Object.keys(ctx.params)[0];
    const resourceId = ctx.params[keyName];
    const resource = keyName.replace("Id", "");
    const [error, resp] = await to(permissionService.checkPermission(resource, resourceId, id));
    if (error) {
        return ctx.app.emit("error", UNKNOWN_ERROR, ctx);
    }
    if (!resp) {
        return ctx.app.emit("error", PERMISSION_IS_NOT_ALLOWED, ctx);
    }
    await next();
};

module.exports = {
    verifyMomentPermission,
    verifyPermission,
};
